package com.vf.s.mvc.sync.common.task.http;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import com.vf.core.render.RenderBean;

import net.sf.json.JSONObject;

public class HttpUtil {
	public static RenderBean doGet(String url, String id, String code, String name, String startTime, String stopTime, int type,
			String param, int curPage, int pageSize) {
		String requestUrl=String.format("%s?id=%s&code=%s&name=%s&startTime=%s&stopTime=%s&type=%s&param=%s&curPage=%s&pageSize=%s",
				url, id, code, name, startTime,stopTime, type, param!=null?param:"",
				curPage, pageSize);
		CloseableHttpClient httpClient = null;
		CloseableHttpResponse response = null;
		System.out.println(requestUrl);
		try {
			// 通过址默认配置创建一个httpClient实例
			httpClient = HttpClients.createDefault();
			// 创建httpGet远程连接实例
			HttpGet httpGet = new HttpGet(requestUrl.replaceAll(" ", "%20"));
			// 设置请求头信息，鉴权
			httpGet.setHeader("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
			// 设置配置请求参数
			RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 连接主机服务超时时间
					.setConnectionRequestTimeout(35000)// 请求超时时间
					.setSocketTimeout(60000)// 数据读取超时时间
					.build();
			// 为httpGet实例设置配置
			httpGet.setConfig(requestConfig);
			// 执行get请求得到返回对象
			response = httpClient.execute(httpGet);
			if(response!=null) {
				HttpEntity entity = response.getEntity();
				String result = EntityUtils.toString(entity);
				if(response.getStatusLine().getStatusCode()==200) {
					RenderBean renderBean=new RenderBean();
					JSONObject json=JSONObject.fromObject(result);
					if(json!=null && json.getInt("code")==200) {
						renderBean.setCode(200);
						renderBean.setMessage(json.getString("message"));
						renderBean.setData(json.get("data"));
					}
					else if(json!=null && json.getInt("code")!=200) {
						renderBean.setCode(json.getInt("code"));
						renderBean.setMessage(json.getString("message"));
					}else {
						renderBean.setCode(500);
						renderBean.setMessage("接口数据空！");
					}
					return renderBean;
				}else {
					RenderBean renderBean=new RenderBean();
					renderBean.setCode(500);
					renderBean.setMessage(EntityUtils.toString(entity));
					return renderBean;
				}
			}
			else {
				RenderBean renderBean=new RenderBean();
				renderBean.setCode(500);
				renderBean.setMessage("未响应！");
				return renderBean;
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
			RenderBean renderBean=new RenderBean();
			renderBean.setCode(500);
			renderBean.setMessage(e.getMessage());
			return renderBean;
		} catch (IOException e) {
			e.printStackTrace();
			RenderBean renderBean=new RenderBean();
			renderBean.setCode(500);
			renderBean.setMessage(e.getMessage());
			return renderBean;
		} finally {
			// 关闭资源
			if (null != response) {
				try {
					response.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (null != httpClient) {
				try {
					httpClient.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public static String doPost(String url, Map<String, Object> paramMap) {
		CloseableHttpClient httpClient = null;
		CloseableHttpResponse httpResponse = null;
		String result = "";
		// 创建httpClient实例
		httpClient = HttpClients.createDefault();
		// 创建httpPost远程连接实例
		HttpPost httpPost = new HttpPost(url);
		// 配置请求参数实例
		RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 设置连接主机服务超时时间
				.setConnectionRequestTimeout(35000)// 设置连接请求超时时间
				.setSocketTimeout(60000)// 设置读取数据连接超时时间
				.build();
		// 为httpPost实例设置配置
		httpPost.setConfig(requestConfig);
		// 设置请求头
		httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
		// 封装post请求参数
		if (null != paramMap && paramMap.size() > 0) {
			List<NameValuePair> nvps = new ArrayList<NameValuePair>();
			// 通过map集成entrySet方法获取entity
			Set<Entry<String, Object>> entrySet = paramMap.entrySet();
			// 循环遍历，获取迭代器
			Iterator<Entry<String, Object>> iterator = entrySet.iterator();
			while (iterator.hasNext()) {
				Entry<String, Object> mapEntry = iterator.next();
				nvps.add(new BasicNameValuePair(mapEntry.getKey(), mapEntry.getValue().toString()));
			}

			// 为httpPost设置封装好的请求参数
			try {
				httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
		try {
			// httpClient对象执行post请求,并返回响应参数对象
			httpResponse = httpClient.execute(httpPost);
			// 从响应对象中获取响应内容
			HttpEntity entity = httpResponse.getEntity();
			result = EntityUtils.toString(entity);
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 关闭资源
			if (null != httpResponse) {
				try {
					httpResponse.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (null != httpClient) {
				try {
					httpClient.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return result;
	}

	public static void main(String[] args) {
		String ak = "yztGGjB8gn2EHN3uQadfEu5Xg25m41m3";
		String road_name = "鱼水路";
		String city = "532503";
		String url = String.format("http://api.map.baidu.com/traffic/v1/road?road_name=%s&city=%s&ak=%s", road_name,
				city, ak);
		System.out.println(url);
		//doGet(url);
		// {"status":0,"message":"成功","description":"鱼水路：双向畅通。","evaluation":{"status":1,"status_desc":"双向畅通"},"road_traffic":[{"road_name":"鱼水路"}]}

	}

}
